package wlxldh357;

public class J21_AccessModifier {

	// 캡슐화 encapsulation 와 접근 제어
	// OOP의 원칙에서 캡슐화는 객체의 일부를 보호하고 노출해도 상관없는 부분을 노출했을 때에는
	// "안전"해야 한다는 매커니즘
	// 예를 들어, 텔레비젼은 캡슐화의 좋은 예임
	// 텔레비젼의 수많은 부품들은 금속커버 안에 놓아둠
	// 클래스 개발자는 변수와 메서드들을 외부로 부터 감춰두어야 함

	// 자바는 접근 제어를 통해 캡슐화를 지원함
	// 접근 제어의 종류에는 4가지가 존재
	// private : 자신만 접근 가능 , 그외는 접근 불가
	// protected : 상속관계의 클래스만 접근 가능
	// public : 어디서나 접근가능함을 의미
	// default : 기본 패키지 내 클래스들 끼리만 접근가능

	// 클래스에 적용 : public, default 만 사용가능
	// 멤버변수에 적용 : public , protected, private, default
	// 메서드에 적용 : public , protected, private, default

	// 결론
	// OOP의 캡슐화 원칙에 따라
	// 클래스의 멤버변수들은 무조건 Private 선언
	// 클래스의 메서드들은 외부에 노출하려면 public 으로 선언하고 , 그외의 경우에는
	// protected 로 선언

	int defaultval;
	
	public int publicval;
	private int privateval;
	public int defautval;

	public void publicMethod() {
	}

	private void privateMethod() {
	}

	void defaultMethod() {
	}

	J21_PublicClass pbc1 = new J21_PublicClass();
	Excercise.J21_PublicClass pbc2 = new Excercise.J21_PublicClass();

	// pbc1.defaultval = 1;
	// pbc1.publicval = 2;
	// pbc1.privateval = 3;

	public static void main(String[] args) {

		// default 클래스 불러오기(실패!!)
		// default 패키지에 선언된 클래스는 같은 패키지내에 존재하는 클래스만이 접근가능
		// 즉, KimHeeJun 패키지에서 default 패키지에 있는 클래스로 접근이 안됨
		// J21_DefaultClass dfc = new J21_DefaultClass();

		// J21_PublicClass 클래스가 public 이라 하더라도
		// defualt 패키지 내에 있으므로 접근 불가
		J21_PublicClass pbc = new J21_PublicClass();

		// 클래스의 멤버변수에 접근
		// 같은 패키지내 멤버변수 접근 pbc1

		pbc.defautval = 1;
		pbc.publicval = 2;

		// pbc1.privateval = 3;

		// 다른 패키지내 클래스의 멤버변수 접근 pbc2
		// pbc2.defautval = 4;

		// pbc2.privateval = 6;

	}

}
